package com.satan.juc.demo19;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;

/*
ArrayBlockingQueue 是一个基于数组结构的有界阻塞队列，它实现了 BlockingQueue 接口。
在多线程环境中，ArrayBlockingQueue 常用于生产者-消费者场景，其中队列的大小在创建时被固定，且不允许为 null 的元素。
*/
public class ArrayBlockingQueueExample {
    private static BlockingQueue<String> queue = new ArrayBlockingQueue<>(500000000, false);
    //在这个例子中，我们创建了一个容量为 5 的 ArrayBlockingQueue。
    //生产者线程向队列中存入元素，如果队列满了，生产者线程会被阻塞直到队列中有空间。
    //消费者线程从队列中取出元素，如果队列为空，消费者线程会被阻塞直到队列中有新元素可取。
    //这种方式确保了在多线程环境下对队列的安全访问，同时避免了复杂的同步问题。
    public static void main(String[] args) {
        // 生产者线程
        for (int i = 0; i < 500; i++) {
            int index = i;
            new Thread(() -> {
                try {
                    String element = "Element" + index;
                    queue.put(element);
                    System.out.println(Thread.currentThread().getName() + "生产者存入: " + element);
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                }
            }).start();
        }

        // 消费者线程
        for (int i = 0; i < 10; i++) {
            new Thread(() -> {
                try {
                    while (true) {
                        String element = queue.take();
                        System.out.println(Thread.currentThread().getName() + "消费者取出: " + element);
                    }
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                }
            }).start();
        }


    }
}
